package cn.yudao.ymcc.service.impl;

import cn.yudao.ymcc.constans.OAuth2TokenConstans;
import cn.yudao.ymcc.domain.Login;
import cn.yudao.ymcc.dto.LoginParamDto;
import cn.yudao.ymcc.dto.RefreshTokenDto;
import cn.yudao.ymcc.mapper.LoginMapper;
import cn.yudao.ymcc.result.JSONResult;
import cn.yudao.ymcc.service.ILoginService;
import cn.yudao.ymcc.utils.HttpUtil;
import cn.yudao.ymcc.vo.OAuthTokenParmVo;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;

/**
 * <p>
 * 登录表 服务实现类
 * </p>
 *
 * @author whale.jia
 * @since 2022-08-04
 */
@Service
public class LoginServiceImpl extends ServiceImpl<LoginMapper, Login> implements ILoginService {



    /**
    * @Title: loginCommon
    * @Description: 登录时获取token -- 包含了登录校验调用了security
    * @Author: Mr.Jia
    * @Version: 1.0
    * @Date:  2022/8/27 15:03
    * @Parameters:
    * @Return
    */
    @Override
    public JSONResult loginCommon(LoginParamDto dto) {
        // type为0为后台登录
        String format = null;
        if (dto.getType() == 0){
            // 获取发送请求的路径
            format = String.format(OAuth2TokenConstans.OAUTH_PASSWORD_TOKEN_URL,
                    OAuth2TokenConstans.AFTER_CLIENTID, OAuth2TokenConstans.AFTER_CLIENT_SECRET,
                    dto.getPassword(), dto.getUsername());
        }else if (dto.getType() == 1){// type为1为前台登录
            // 根据传入的参数发起Http请求获取token
            format = String.format(OAuth2TokenConstans.OAUTH_PASSWORD_TOKEN_URL,
                    OAuth2TokenConstans.BEFORE_CLIENTID, OAuth2TokenConstans.BEFORE_CLIENT_SECRET,
                    dto.getPassword(), dto.getUsername());
        }else {
            // 如果能到这一步说明有前端有问题
            return JSONResult.error("请求参数异常");
        }
        // 根据传入的参数发起Http请求获取token
        String token = HttpUtil.sendPost(format, null);
        if (token != null){
            OAuthTokenParmVo oAuthTokenParmVo = JSONObject.parseObject(token, OAuthTokenParmVo.class);
            // 设置token的过期时间
            oAuthTokenParmVo.setExpiresTime(System.currentTimeMillis() + oAuthTokenParmVo.getExpires_in());
            return JSONResult.success(oAuthTokenParmVo);
        }
        // 如果能到这一步说明没有拿到值
        return JSONResult.error("请求参数异常");
    }

    /**
    * @Title: tokenRefresh
    * @Description: 刷新token
    * @Author: Mr.Jia
    * @Version: 1.0
    * @Date:  2022/8/27 18:55
    * @Parameters:
    * @Return
    */
    @Override
    public JSONResult tokenRefresh(RefreshTokenDto dto) {
        // type为0为后台登录
        String format = null;
        Wrapper<Login> wrapper = new EntityWrapper<>();
        wrapper.eq("uasename",dto.getUsername());
        Login login = selectOne(wrapper);
        if (login.getType() == 0){
            // 获取发送请求的路径
            format = String.format(OAuth2TokenConstans.REFRESH_TOKEN_URL,
                    dto.getRefreshToken()
                    ,OAuth2TokenConstans.AFTER_CLIENTID
                    , OAuth2TokenConstans.AFTER_CLIENT_SECRET);
        }else if (login.getType() == 1){// type为1为前台登录
            // 根据传入的参数发起Http请求获取token
            format = String.format(OAuth2TokenConstans.REFRESH_TOKEN_URL,
                    dto.getRefreshToken(),
                    OAuth2TokenConstans.BEFORE_CLIENTID,
                    OAuth2TokenConstans.BEFORE_CLIENT_SECRET);
        }else {
            // 如果能到这一步说明有前端有问题
            return JSONResult.error("请求参数异常");
        }
        String token = HttpUtil.sendPost(format, null); // 发送请求得到值
        // 根据传入的参数发起Http请求获取token
        if (token != null){
            OAuthTokenParmVo oAuthTokenParmVo = JSONObject.parseObject(token, OAuthTokenParmVo.class);
            // 设置token的过期时间
            oAuthTokenParmVo.setExpiresTime(System.currentTimeMillis() + oAuthTokenParmVo.getExpires_in());
            return JSONResult.success(oAuthTokenParmVo);
        }
        // 如果能到这一步说明没有拿到值
        return JSONResult.error("请求参数异常");
    }
}
